package com.mjf.net.udp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 * 1.类 DatagramSocket 和 DatagramPacket【数据包】 实现了基于UDP协议网络程序
 * 2.UDP数据包通过套接字 DatagramSocket 发送和接收，系统不保证UDP数据包一定能够安全送到目的地，也不能确定什么时候可以抵达
 * 3.DatagramPacket 对象封装了UDP数据包，在数据包中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号
 * 4.UDP协议中每个数据包都给出了完整的地址信息，因此无须建立发送方和接收方的连接
 */
public class UDPReceiverA {
    public static void main(String[] args) throws IOException {

        // 创建一个 DatagramSocket 对象，准备在 9999 接收数据
        DatagramSocket socket = new DatagramSocket(9999);

        // 构建一个 DatagramPacket 对象，准备接收数据。UDP一个数据包最大64k
        byte[] buf = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buf, buf.length);

        // 将通过网络传输的 DatagramPacket 对象，填充到 packet 对象
        // 当有数据包发送到本机的 9999端口 时，就会接收到数据
        // 如果没有数据包发送到本机的 9999端口, 就会阻塞等待
        System.out.println("等待接收数据..");
        socket.receive(packet);

        // 把 packet 进行拆包，取出数据，并显示
        int length = packet.getLength();    // 实际接收到的数据字节长度
        byte[] data = packet.getData(); // 接收到数据
        String s = new String(data, 0, length);
        System.out.println(s);


        // 回复信息给B端
        // 将需要发送的数据，封装到 DatagramPacket对象
        data = "好的, 明天见".getBytes();
        // 封装的 DatagramPacket 对象。 data 内容字节数组, data.length, 主机(IP), 端口
        packet = new DatagramPacket(data, data.length, InetAddress.getByName("192.168.124.9"), 9998);

        socket.send(packet);    // 发送

        socket.close();

    }
}
